package main

import "fmt"

func main()  {
	/*
	函数本身也是一种数据类型：函数类型(和参数和返回值有关)
		注意点：不同的函数，类型也不同

	可以将函数看做一种变量，可以赋值给其他的变量名
	a := fun1
	注意区分
	b := fun1()
	 */
	num1 := 1
	num2 := 2
	fmt.Println(num1, num2)
	res1 := fun1(num1, num2)// 调用函数，将结果返回
	fmt.Println(res1)
	arr1 := [4] int{1,2,3,4}
	fmt.Printf("%T\n", arr1) // [4]int
	arr2 := [5] int{1,2,3,4,5}
	fmt.Printf("%T\n", arr2) // [5]int
	fmt.Printf("%T,%T,%T\n", num1,num2,res1)
	fmt.Printf("%T\n", fun1) // func(int, int) int,函数fun1 的类型

	var b func(int, int) int
	b = fun1 // 将fun1的值给b
	fmt.Printf("%T\n", b)
	c := fun1
	fmt.Printf("%T\n",c)
	fmt.Println(fun1, b, c)

	res2 := b(100, 200) // b因为指向了fun1的内存，所以也是一个函数类型，急速一个函数
	fmt.Println(res2)

	c(1, 2)

	d := fun3 // 将fun3赋值给d，那么d也是一个函数，可以被调用
	e := fun3() // 将fun3进行调用，将函数的执行结果，赋值给e
	f := d()
	fmt.Println(e, f)

	fmt.Printf("%T\n", fun2)
	fmt.Printf("%T\n",fun3)

}

func fun1(a, b int) int  { //func(int, int) int
	return a + b
}

func fun2(a int, s1 string)  { // func(int, string)

}

func  fun3() string  { //func() string
	return "memeda"
}